import { ref } from 'vue';
import { message } from 'ant-design-vue';

/**
 * 复制文本到剪贴板的hook
 * @returns {Object} 包含复制方法和状态的对象
 * @property {Function} copyToClipboard - 复制文本到剪贴板的方法
 * @property {Ref<boolean>} isCopied - 是否复制成功的状态
 * @property {Ref<boolean>} isSupported - 是否支持剪贴板API的状态
 */
export function useCopy() {
  const isCopied = ref(false);
  const isSupported = ref(!!navigator.clipboard);

  /**
   * 复制文本到剪贴板
   * @param {string} text - 要复制的文本内容
   * @param {Object} options - 配置选项
   * @param {string} options.successMessage - 复制成功时的提示消息，默认为"已复制到剪贴板"
   * @param {string} options.errorMessage - 复制失败时的提示消息，默认为"复制失败，请手动复制"
   * @param {number} options.duration - 成功状态持续时间（毫秒），默认为2000
   * @returns {Promise<boolean>} 返回复制是否成功的Promise
   */
  const copyToClipboard = async (text, options = {}) => {
    const {
      successMessage = '已复制到剪贴板',
      errorMessage = '复制失败，请手动复制',
      duration = 2000,
    } = options;

    if (!isSupported.value) {
      message.error('当前浏览器不支持剪贴板API');
      return false;
    }

    try {
      await navigator.clipboard.writeText(text);
      isCopied.value = true;
      message.success(successMessage);

      // 设置定时器，在指定时间后重置复制状态
      setTimeout(() => {
        isCopied.value = false;
      }, duration);

      return true;
    } catch (error) {
      console.error('复制失败:', error);
      message.error(errorMessage);

      // 降级方案：使用传统方法复制
      try {
        const textArea = document.createElement('textarea');
        textArea.value = text;
        textArea.style.position = 'fixed';
        textArea.style.left = '-9999px';
        document.body.appendChild(textArea);
        textArea.select();
        document.execCommand('copy');
        document.body.removeChild(textArea);

        isCopied.value = true;
        setTimeout(() => {
          isCopied.value = false;
        }, duration);

        message.success(successMessage);
        return true;
      } catch (fallbackError) {
        console.error('降级复制失败:', fallbackError);
        message.error(errorMessage);
        return false;
      }
    }
  };

  return {
    isCopied,
    isSupported,
    copyToClipboard,
  };
}
